package it.duecaffe.claysoftware.interventi.client.view;

import it.duecaffe.claysoftware.interventi.client.handler.InserisciInterventoEvent;
import it.duecaffe.claysoftware.interventi.client.handler.Utils;
import it.duecaffe.claysoftware.interventi.client.widget.textarea.RichTextToolbar;
import it.duecaffe.claysoftware.interventi.shared.models.InterventoModel;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.RichTextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

/**
 * Inserimento dati di un nuovo intervento dal cliente da parte del tecnico
 * e visualizzazione della schermata riepilogativa da cui confermare l'inserimento 
 * @author Alex
 *
 */
public class NuovoIntervento extends FormPanel {

	private FlexTable flexTable, flexRow;
	private int intRow, intCol, intRowRow, intColRow;

	/**
	 * Costruttore per nuovo intervento con dati da inserire
	 */
	public NuovoIntervento() {
		init(null);
	}

	/**
	 * Costruttore per nuovo intervento con dati da confermare
	 */
	public NuovoIntervento(InterventoModel intervento) {
		init(intervento);
	}

	private void init(InterventoModel intervento) {
		// Tabella generale del form
		flexTable = new FlexTable();
		flexTable.setCellPadding(0);
		flexTable.setCellSpacing(0);

		// Tabella per la riga
		flexRow = new FlexTable();
		flexRow.setCellPadding(0);
		flexRow.setCellSpacing(0);

		intRow = 0;
		intCol = 0;
		intRowRow = 0;
		intColRow = 0;

		buildForm(intervento);

		add(flexTable);
	}

	private void buildForm(InterventoModel intervento) {
		// Aggiunta list clienti
		if (intervento != null) {
			addElement("Cliente", intervento.getIdCliente(), "100");
		} else {
			addElement("Cliente", getListClienti());
		}
		newRowRow();
		// Aggiunta descrizione intervento
		if (intervento != null) {
			addElement("Descrizione intervento", intervento.getDescrizione(), "100");
		} else {
			addElement("Descrizione intervento", getTextAreaIntervento());
		}
		newRow();
		// Aggiunta "dalle ore ...  alle ore ..." - campo numerico
		if (intervento != null) {
			addElement("Ora inizio", intervento.getOraInizio(), "100");
		} else {
			TextBox oraInizio = new TextBox();
			oraInizio.ensureDebugId("cwText-oraInizio");
			addElement("Ora inizio", oraInizio);
		}
		if (intervento != null) {
			addElement("Ora fine", intervento.getOraFine(), "100");
		} else {
			TextBox oraFine = new TextBox();
			oraFine.ensureDebugId("cwText-oraFine");
			addElement("Ora fine", oraFine);
		}
		newRowRow();
		// Aggiunta eventuale pausa  - campo numerico
		if (intervento != null) {
			addElement("Pausa", intervento.getPausa(), "100");
		} else {
			TextBox pausa = new TextBox();
			pausa.ensureDebugId("cwText-pausa");
			addElement("Pausa", pausa);
		}
		// Aggiunta durata - campo numerico (calcolato)
		if (intervento != null) {
			addElement("Durata", intervento.getDurata(), "100");
		} else {
			addElement("Durata", getDurata());
		}
		newRow();
		// Aggiunta diritto di chiamata e viaggio - booleano
		if (intervento != null) {
			addElement("Diritto di chiamata", (intervento.isDirittoChiamata() ? "Si" : "No"), "100");
		} else {
			addElement("Diritto di chiamata", getRadioDiritto());
		}
		newRow();
		if (intervento != null) {
			addButtons(true);
		} else {
			addButtons(false);
		}
	}

	/**
	 * Aggiunta di un field per il formPanel
	 * @param label Label
	 * @param field Componente del formPanel
	 */
	private void addElement(String label, Widget widget) {

		// Aggiunta testo
		flexRow.setText(intRowRow, intColRow, label);
		if (intColRow == 0) {
			flexRow.getFlexCellFormatter().setStyleName(intRowRow, intColRow, "inputTableTheadFirstChild");	
		} else {
			flexRow.getFlexCellFormatter().setStyleName(intRowRow, intColRow, "inputTableThead");
		}

		// Aggiunta widget
		flexRow.setWidget(intRowRow+1, intColRow, widget);
		if (intColRow == 0) {
			flexRow.getFlexCellFormatter().setStyleName(intRowRow+1, intColRow, "inputTableTbodyFirstChild");	
		} else {
			flexRow.getFlexCellFormatter().setStyleName(intRowRow+1, intColRow, "inputTableTbody");
		}

		intColRow += 1;

	}

	/**
	 * Aggiunta di una stringa
	 * @param label Label
	 * @param contenuto Componente
	 */
	private void addElement(String label, String contenuto, String width) {

		// Aggiunta testo
		flexRow.setText(intRowRow, intColRow, label);
		if (intColRow == 0) {
			flexRow.getFlexCellFormatter().setStyleName(intRowRow, intColRow, "inputTableTheadFirstChild");	
		} else {
			flexRow.getFlexCellFormatter().setStyleName(intRowRow, intColRow, "inputTableThead");
		}

		// Aggiunta test
		Label labelField = new Label(contenuto);
		labelField.setWidth(width);
		flexRow.setWidget(intRowRow+1, intColRow, labelField);
		if (intColRow == 0) {
			flexRow.getFlexCellFormatter().setStyleName(intRowRow+1, intColRow, "inputTableTbodyFirstChild");	
		} else {
			flexRow.getFlexCellFormatter().setStyleName(intRowRow+1, intColRow, "inputTableTbody");
		}

		intColRow += 1;

	}

	private void newRowRow() {
		intColRow = 0;
		intRowRow += 2;
	}

	/**
	 * Creazione nuova riga nel form
	 */
	public void newRow() {

		flexTable.setWidget(intRow, intCol, flexRow);
		intRow += 1;

		flexRow = new FlexTable();
		flexRow.setCellPadding(0);
		flexRow.setCellSpacing(0);

		intRowRow = 0;
		intColRow = 0;
	}

	private ListBox getListClienti() {
		ListBox clientiBox = new ListBox(false);
		clientiBox.setWidth("400");
		String[] listClienti = {"Plebani Alex", "Celesti Marco"};
		for (int i = 0; i < listClienti.length; i++) {
			clientiBox.addItem(listClienti[i]);
		}
		return clientiBox;
	}

	private Widget getTextAreaIntervento() {
		// Create the text area and toolbar
		RichTextArea area = new RichTextArea();
		area.ensureDebugId("cwRichText-area");
		area.setSize("100%", "14em");
		RichTextToolbar toolbar = new RichTextToolbar(area);
		toolbar.ensureDebugId("cwRichText-toolbar");
		toolbar.setWidth("100%");

		// Add the components to a panel
		Grid grid = new Grid(2, 1);
		grid.setStyleName("cw-RichText");
		grid.setWidget(0, 0, toolbar);
		grid.setWidget(1, 0, area);
		return grid;
	}

	private TextBox getDurata() {
		TextBox durata = new TextBox();
		durata.ensureDebugId("cwText-pausa");
		return durata;
	}

	private Widget getRadioDiritto() {
		HorizontalPanel hPanel = new HorizontalPanel();

		RadioButton radioSi = new RadioButton("diritto", "Si");
		radioSi.ensureDebugId("cwRadioDiritto-colorSi");
		radioSi.setEnabled(true);

		RadioButton radioNo = new RadioButton("diritto", "No");
		radioNo.ensureDebugId("cwRadioDiritto-colorNo");
		radioNo.setEnabled(true);
		radioNo.setValue(true);

		hPanel.add(radioSi);
		hPanel.add(radioNo);

		return hPanel;
	}

	private void addButtons(final boolean conferma) {
		newRowRow();

		if (!conferma) {
			Button btnCancella = new Button("Cancella");
			// We can set the id of a widget by accessing its Element
			btnCancella.getElement().setId("cancellaButton");
			// Add a handler to close the DialogBox
			btnCancella.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					//				userId.setValue("");
					//				userId.setFocus(true);
					//				pwd.setValue("");
					//				pwd.setEnabled(false);
				}
			});
			flexRow.setWidget(intRowRow, intColRow, btnCancella);
			intColRow += 1;
		} else {
			Button btnModifica = new Button("Modifica");
			// We can set the id of a widget by accessing its Element
			btnModifica.getElement().setId("modificaButton");
			// Add a handler to close the DialogBox
			btnModifica.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					//					userId.setValue("");
					//					userId.setFocus(true);
					//					pwd.setValue("");
					//					pwd.setEnabled(false);

				}
			});
			flexRow.setWidget(intRowRow, intColRow, btnModifica);
			intColRow += 1;
		}
		Button btnConferma = new Button("Conferma");
		// We can set the id of a widget by accessing its Element
		btnConferma.getElement().setId("confirmButton");
		// Add a handler to close the DialogBox
		btnConferma.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				//				userId.setValue("");
				//				userId.setFocus(true);
				//				pwd.setValue("");
				//				pwd.setEnabled(false);
				InterventoModel intervento = new InterventoModel();
				intervento.setDataIntervento("20130103");
				intervento.setDescrizione("prova nuovo intervento");
				intervento.setDirittoChiamata(true);
				intervento.setDurata("60");
				intervento.setIdCliente("1");
				intervento.setIdUtente("CLY");
				intervento.setOraInizio("10");
				intervento.setOraFine("11");
				intervento.setPausa("0");
				Utils.EVENT_BUS.fireEvent(new InserisciInterventoEvent(intervento,conferma));
			}
		});
		flexRow.setWidget(intRowRow, intColRow, btnConferma);

		flexTable.setWidget(intRow, intCol, flexRow);
		flexTable.getCellFormatter().setHorizontalAlignment(intRow, intCol, HasHorizontalAlignment.ALIGN_CENTER);
	}

}
